package router

import (
	"github.com/gin-contrib/cors"
	"github.com/gin-gonic/gin"
	swaggerFiles "github.com/swaggo/files"
	gs "github.com/swaggo/gin-swagger"
	_ "prj-layout/docs"
	"prj-layout/internal/api"
	"prj-layout/internal/router/midware"
)

func SetupRouter() *gin.Engine {
	engine := gin.New() // 由于要使用一些自定义的中间件所以这里需要 New 一个全新的 Gin 实例

	// 注册全局中间件
	engine.Use(cors.Default(), // 跨域中间件
		midware.ZapLoggerMiddleware(), // 自定义 zapLog 中间件取代 gin 框架默认的日志中间件
		gin.Recovery(),                // gin 框架默认的错误恢复中间件
	)


	// 解决 405 错误
	engine.HandleMethodNotAllowed = true
	// 上传文件的时候, 需要指定的缓冲区大小
	engine.MaxMultipartMemory = 8 << 20 // 8MB
	// http://localhost:8080/swagger/index.html
	engine.GET("/swagger/*any", gs.WrapHandler(swaggerFiles.Handler))

	// 在网络上共享上传的文件
	engine.Static("/uploads", "./uploads")

	exampleGroup := engine.Group("/example")
	{
		// 最简单的 GET 请求, 不携带任何参数
		exampleGroup.GET("/simpleGet", api.ExampleApi.SimpleGet)
		// GET 请求, 使用 URL 传递参数
		exampleGroup.GET("/getWithUrlQueryString", api.ExampleApi.GetWithUrlQueryString)
		// GET 请求, 使用 URL 路径传递参数 PathVariable 形式
		exampleGroup.GET("/getWithPathVar/groups/:group_id/accounts/:account_id", api.ExampleApi.GetWithPathVariable)
		// GET 请求, 用 Header 传递数据
		exampleGroup.GET("/getAuthorizationHeader", api.ExampleApi.GetAuthorizationHeader)
		// GET 请求, 使用 swagger 中的扩展属性
		exampleGroup.GET("/getExtendAttribute", api.ExampleApi.GetExtendAttribute)

		// 最简单的 POST 请求, 不携带任何参数
		exampleGroup.POST("/simplePost", api.ExampleApi.SimplePost)
		// POST 请求, 请求参数在 URL 中
		exampleGroup.POST("/postWithUrlQuery", api.ExampleApi.PostWithUrlQuery)
		// POST 请求, 使用 URL 路径传递参数 PathVariable 形式
		exampleGroup.POST("/postWithPathVariable/groups/:group_id/accounts/:account_id", api.ExampleApi.PostWithPathVariable)
		// POST 请求, 用 Header 传递数据
		exampleGroup.POST("/postAuthorizationHeader", api.ExampleApi.PostAuthorizationHeader)
		// POST 请求, 使用 swagger 中的扩展属性
		exampleGroup.POST("/postExtendAttribute", api.ExampleApi.PostExtendAttribute)
		// POST 请求, 发送 JSON 数据, 数据在消息体中
		exampleGroup.POST("/postJsonData", api.ExampleApi.PostJsonData)
		// POST 请求, 发送 multipart/form-data 类型的表单数据, 参数在消息体中
		exampleGroup.POST("/postFormData", api.ExampleApi.PostFormData)
		// POST 请求, 发送 x-www-form-urlencodered 类型的表单数据, 参数在消息体中, 编码方式为 urlencoder
		exampleGroup.POST("/postUrlEncodedFormData", api.ExampleApi.PostUrlEncodedFormData)
	}
	userGroup := engine.Group("/user")
	{
		// 注册
		userGroup.POST("/register", api.UserApi.Register)
		// 登录
		userGroup.POST("/login", api.UserApi.Login)
		// 获取所有用户信息
		userGroup.GET("/getAll", api.UserApi.GetAllUser)
		// 需要身份认证的路由
		userGroup.GET("/testAuth", midware.JwtAuthMiddleware(), api.UserApi.TestAuth)
		// 分页获取数据
		userGroup.GET("/getPagedUserList", api.UserApi.GetPagedUserList)

		userGroup.POST("/testTime", api.UserApi.TestTime)

		userGroup.POST("/testTime1", api.UserApi.TestTime1)

		userGroup.GET("/getUserByTime", api.UserApi.GetUserByTime)
	}

	return engine
}
